package com.biblioteca.controller;

import java.util.Collection;

import com.biblioteca.entity.Entity;
import com.biblioteca.repositorio.Repositorio;
import com.biblioteca.utils.Return;

public abstract class BaseController<T extends Entity> {
	
	private Repositorio<T> repository;
	
	protected BaseController(Repositorio<T> repositorio){
		repository = repositorio;
	}
	
	public void setRepository(Repositorio<T> repositorio){
		this.repository = repositorio;
	}
	
	public Return save (T entidade) {
		String mensagem = "";		
		try {
			if(entidade == null){
				return new Return("Objeto não pode ser nulo\n");
			}
			Return retorno = this.isValid(entidade);			
			if(retorno.isValid()){
				repository.put(entidade);
			} else {
				mensagem += retorno.getMessage();
			}
		}
		catch (Exception exception) {
			exception.printStackTrace();
			mensagem = exception.getMessage();
		}
		return new Return(mensagem);	
	}
	
	public Return delete(Integer key){
		String message = "";
		try{
			if (key == null){
				return new Return("Chave não pode ser nula!\n");
			}
			Return retorno = this.isValidDelete(this.getByKey(key));
			if (retorno.isValid()){
				repository.remove(key);
			} else {
				message += retorno.getMessage();
			}
			
		}
		catch(Exception ex){
			ex.printStackTrace();
			message = ex.getMessage();
		}
		
		return new Return(message);
	}
	
	public Collection<T> getAll(){
		try{
			
			return repository.getAll();
		}
		catch(Exception ex){
			ex.printStackTrace();
			return null;
		}
	}
	
	public T getByKey(Integer key){
		try{
			return repository.getByKey(key);
		}
		catch(Exception ex){
			ex.printStackTrace();
			return null;
		}
	}
	
	protected abstract Return isValid(T entity);
	
	protected abstract Return isValidDelete(T entity);
}
